/*
 * Copyright (c) 2022-2023 cetcclout Co., Ltd All rights reserved.
 * Sensor Adapter is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *          http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */
package com.cetccloud.cimp.common.util;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.UUID;
 
/**
 * @apiNote date与String互转
 */
public class DateAndStringUtil {
 
	/**
	 * 判断字符串是否是日期格式(格式类型：yyyy-MM-dd)
	 *
	 * @param date_string
	 * @return
	 */
	public static boolean isDate(String date_string) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		// 这里要捕获一下异常信息
		try {
			format.parse(date_string);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
 
	/** 获取当前时间（返回格式：yyyyMMddHHmmss） */
	public static String getTime() throws Exception {
		Date date = new Date();
		// 设置日期格式
		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
		// new Date()为获取当前系统时间
		String time = df.format(date);
		return time;
	}
 
	/**
	 * 获取当前时间(返回格式：yyyy-MM-dd HH:mm:ss)
	 *
	 * @return
	 * @throws Exception
	 */
	public static String getTime1() throws Exception {
		Date date = new Date();
		// 设置日期格式
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// new Date()为获取当前系统时间
		String time = df.format(date);
		return time;
	}
 
	/**
	 * 获取当前时间(返回格式：yyyy-MM-dd)
	 *
	 * @return
	 * @throws Exception
	 */
	public static String getTime2() throws Exception {
		String time = null;
		Date date = new Date();
		// 设置日期格式
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		// new Date()为获取当前系统时间
		time = df.format(date);
		return time;
	}
 
 
	/**
	 * 自定义格式
	 * 获取当前时间(返回格式：yyyy-MM-dd_HH)
	 *
	 * @return
	 * @throws Exception
	 */
	public static String getTime4(){
		String time = null;
		Date date = new Date();
		// 设置日期格式
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH");
		// new Date()为获取当前系统时间
		time = df.format(date);
		return time;
	}
 
 
	/**
	 * 获取当天日期
	 *
	 * @return
	 */
	public static Date getTime3() throws Exception {
		Date date = new Date();
		// 设置日期格式
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		try {
			String time = df.format(date);
			// 获取时间
			date = df.parse(time);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
 
	/**
	 * 自定义格式
	 * 获取当前时间(返回格式：yyyy-MM-dd HH:mm)
	 *
	 * @return
	 * @throws Exception
	 */
	public static String getTime5(){
		String time = null;
		Date date = new Date();
		// 设置日期格式
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
		// new Date()为获取当前系统时间
		time = df.format(date);
		return time;
	}
 
 
	/**
	 * 获取当前时间(返回格式：yyyy-MM-dd)
	 *
	 * @return
	 * @throws Exception
	 */
	public static String getTime6(){
		String time = null;
		Date date = new Date();
		// 设置日期格式
		SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
		// new Date()为获取当前系统时间
		time = df.format(date);
		return time;
	}
 
 
	/**
	 * 获取过去某一天的日期 yyyy-MM-dd
	 *
	 * @return
	 */
	public static String lastDay(int num) throws Exception {
		Date dNow = new Date(); // 当前时间
		Date dBefore = new Date();
		Calendar calendar = Calendar.getInstance(); // 得到日历
		calendar.setTime(dNow);// 把当前时间赋给日历
		calendar.add(Calendar.DAY_OF_MONTH, -num); // 设置为前num天
		dBefore = calendar.getTime(); // 得到前num天的时间
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 设置时间格式
		String defaultStartDate = sdf.format(dBefore); // 格式化前num天
		return defaultStartDate;
	}
 
	/**
	 * 获取 多少年前/后 的时间
	 * @param year 正数代表未来，负数代表过去
	 * @return
	 */
	public static String getYearMonthDay(int year) {
 
		Calendar now = Calendar.getInstance();
		now.add(Calendar.YEAR, year); // 现在时间是传入year年后
		Date time = now.getTime();
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		String format = dateFormat.format(time);
		return format;
	}
 
	// -----------------------------------------------------String转date----------------------------------------//
	/**
	 * String转date(字符串格式：yyyy-MM-dd)
	 *
	 * @param str
	 * @return
	 * @throws Exception
	 */
	public static Date StringToDate1(String str) throws Exception {
		// 设置日期格式
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date date = sdf.parse(str);
		return date;
	}
 
	/**
	 * 字符串传date(字符串格式：yyyyMMddhhmmss)
	 *
	 * @param str
	 * @return
	 * @throws Exception
	 */
	public static Date StringToDate2(String str) throws Exception {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
		Date date = sdf.parse(str);
		return date;
	}
 
	/**
	 * 字符串传date(字符串格式：yyyy-MM-dd HH:mm:ss )
	 *
	 * @param str
	 * @return
	 * @throws Exception
	 */
	public static Date StringToDate3(String str) throws Exception {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = (Date) sdf.parse(str);
		return date;
	}
 
	/**
	 * 字符串转date（字符串格式：yyyy年MM月dd日  HH:mm）2020年01月03日  15:00
	 *
	 * @param str
	 * @return
	 * @throws Exception
	 */
	public static Date StringToDate4(String str) throws Exception {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");
		Date date = (Date) sdf.parse(str);
		return date;
	}
 
	/**
	 * 字符串传date(字符串格式：EEE, dd MMM yyyy HH:mm a )
	 *
	 * @param str
	 * @return
	 * @throws Exception
	 */
	public static Date StringToDate5(String str) throws Exception {
		SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm a", Locale.US);
		Date date = (Date) sdf.parse(str);
		return date;
	}
 
	/**
	 * 字符串传date(字符串格式：MMM d, yyyy hh:mm a )
	 * March 4, 2020 6:00 AM
	 * @param str
	 * @return
	 * @throws Exception
	 */
	public static Date StringToDate6(String str) throws Exception {
		SimpleDateFormat sdf = new SimpleDateFormat("MMM d, yyyy hh:mm a", Locale.US);
		Date date = (Date) sdf.parse(str);
		return date;
	}
 
	/**
	 * 字符串转Calendar（字符串格式：yyyy-MM-dd）
	 *
	 * @param str
	 * @return
	 * @throws Exception
	 */
	public static Calendar StringToCalendar(String str) throws Exception {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date date = sdf.parse(str);
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar;
	}
 
	// -----------------------------------------------------date转String----------------------------------------//
	/**
	 * 时间戳转字符串(转后的字符串格式：yyyy-mm-dd)
	 *
	 * @param ts
	 * @return
	 */
	public static String timestampToString(Timestamp ts) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		String time = sdf.format(ts);
		return time;
	}
 
	/**
	 * yyyyMMdd 转 yyyy-MM-dd
	 *
	 * @param str
	 * @return
	 * @throws Exception
	 */
	public static String stringToDateString(String str) throws Exception {
		SimpleDateFormat sf1 = new SimpleDateFormat("yyyyMMdd");
		SimpleDateFormat sf2 = new SimpleDateFormat("yyyy-MM-dd");
		String sfstr = sf2.format(sf1.parse(str));
		return sfstr;
	}
 
	/**
	 * date转字符串(yyyy-MM-dd HH:mm:ss)
	 *
	 * @param date 日期
	 * @return
	 */
	public static String dateToString(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sdf.format(date);
	}
 
	/**
	 * date转字符串(yyyy-MM-dd)
	 *
	 * @param date
	 * @return
	 */
	public static String dateToString2(Date date) {
		String time = null;
		try {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			time = sdf.format(date);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return time;
	}
 
	/**
	 * date转换字符串（格式：yyyyMMdd)
	 *
	 * @param date
	 * @return
	 */
	public static String dateToString3(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String time = sdf.format(date);
		return time;
	}
 
	/**
	 * date转换字符串（转后字符格式：yyyyMMddHHmmss)
	 *
	 * @param date
	 * @return
	 */
	public static String dateToString4(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
		String time = sdf.format(date);
		return time;
	}
 
	/**
	 * date转字符串(yyyy-MM-dd HH:mm)
	 *
	 * @param date 日期
	 * @return
	 */
	public static String dateToString5(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
		return sdf.format(date);
	}
 
	// ------------------------------------------------日期格式转换------------------------------------------------------------
	/**
	 * 日期字符格式转换 mm/dd/yyyy--->yyyy-MM-dd
	 */
	@SuppressWarnings("deprecation")
	public static String transDateString(String str) {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		Date date = new Date(str);
		String string = df.format(date);
		return string;
	}
 
	/**
	 * 日期字符格式转换yyyy-MM-DD HH:mm:ss-->MM/dd/yyyy HH:mm:ss
	 *
	 * @return
	 *
	 * @throws Exception
	 */
	public static String transDateString2(String str) throws Exception {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = sdf.parse(str);
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int year = calendar.get(Calendar.YEAR);
		int month = calendar.get(Calendar.MONTH) + 1;
		int day = calendar.get(Calendar.DATE);
		int hour = calendar.get(Calendar.HOUR_OF_DAY);
		int minute = calendar.get(Calendar.MINUTE);
		int second = calendar.get(Calendar.SECOND);
 
		String string = addNum(month) + "/" + addNum(day) + "/" + year + " " + addNum(hour) + ":" + addNum(minute) + ":"
				+ addNum(second);
 
		return string;
 
	}
 
	public static String addNum(int i) {
		String str = "";
		if ((i + "").length() == 1) {
			str = "0" + i;
		} else {
			str = i + "";
		}
		return str;
	}
 
	public static String[] chars = new String[] { "a", "b", "c", "d", "e", "f",
			"g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
			"t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
			"6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I",
			"J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
			"W", "X", "Y", "Z" };
 
	/**
	 * 生成8位随机字符串
	 * @brief
	 * @param
	 * @return
	 *
	 */
	public static String generateShortUuid() {
		StringBuffer shortBuffer = new StringBuffer();
		String uuid = UUID.randomUUID().toString().replace("-", "");
		for (int i = 0; i < 8; i++) {
			String str = uuid.substring(i * 4, i * 4 + 4);
			int x = Integer.parseInt(str, 16);
			shortBuffer.append(chars[x % 0x3E]);
		}
		return shortBuffer.toString();
	}
 
	/**
	 * 获取某月最后一天
	 * @param searchTime
	 * @return
	 */
	public static String getLastDayOfMonth(String searchTime) throws Exception{
		//格式化日期
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date date = sdf.parse(searchTime);
		Calendar calendar = Calendar.getInstance();//日历对象
		calendar.setTime(date);//设置当前日期
		//获取某月最大天数
		int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		//设置日历中月份的最大天数
		calendar.set(Calendar.DAY_OF_MONTH, lastDay);
		String lastDayOfMonth = sdf.format(calendar.getTime());
		return lastDayOfMonth;
	}
 
	/**
	 * 获取某个月的第一天
	 * @param searchTime
	 * @return
	 */
	public static String getFirstDayOfMonth(String searchTime) throws Exception{
		//格式化日期
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date date = sdf.parse(searchTime);
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		//获取某月最小天数
		int lastDay = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
		//设置日历中月份的最大天数
		cal.set(Calendar.DAY_OF_MONTH, lastDay);
 
		String lastDayOfMonth = sdf.format(cal.getTime());
		return lastDayOfMonth;
	}
 
	/**
	 * 计算某天n天之后的日期
	 * @param day
	 * @return
	 */
	public static String getBeforeAfterDateDay(String time, int day) throws Exception{
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date date = sdf.parse(time);
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
 
		int Year = cal.get(Calendar.YEAR);
		int Month = cal.get(Calendar.MONTH);
		int Day = cal.get(Calendar.DAY_OF_MONTH);
 
		int NewDay = Day + day;
 
		cal.set(Calendar.YEAR, Year);
		cal.set(Calendar.MONTH, Month);
		cal.set(Calendar.DAY_OF_MONTH, NewDay);
 
		String newTime = sdf.format(new Date(cal.getTimeInMillis()));
		return newTime;
	}
 
}
